unit pianimanutenzioni_frm; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, EditBtn, ZDataset, datamodule_frm;

type

  { TPianiManutenzioni }

  TPianiManutenzioni = class(TForm)
    btelimina: TButton;
    btnuovo: TButton;
    btsalva: TButton;
    cbpiani_manutenzioni: TComboBox;
    cbtemplate: TComboBox;
    cbUMIntervallo: TComboBox;
    cbtipomanutenzione: TComboBox;
    eddatainizio: TDateEdit;
    eddatafine: TDateEdit;
    edNome: TLabeledEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    lbl_DataFine: TLabel;
    lbl_DataInizio: TLabel;
    edintervallo: TLabeledEdit;
    lblobbligatori: TLabel;
    mmNote: TMemo;
    zq_piani_manutenzioni: TZQuery;
    procedure bteliminaClick(Sender: TObject);
    procedure btnuovoClick(Sender: TObject);
    procedure btsalvaClick(Sender: TObject);
    procedure cbpiani_manutenzioniChange(Sender: TObject);
    procedure cbpiani_manutenzioniExit(Sender: TObject);
    procedure cbpiani_manutenzioniKeyPress(Sender: TObject; var Key: char);
    procedure edNomeChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure LoadComboPianiManutenzioni();
    procedure LoadComboTemplate();
    procedure ClearCampi();
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  PianiManutenzioni: TPianiManutenzioni;

implementation

{ TPianiManutenzioni }

procedure TPianiManutenzioni.FormCreate(Sender: TObject);
begin
  LoadComboPianiManutenzioni();
  LoadComboTemplate();
end;

procedure TPianiManutenzioni.FormClose(Sender: TObject;
  var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;
end;

procedure TPianiManutenzioni.btnuovoClick(Sender: TObject);
begin
  //pulisce tutti i campi per consentire un nuovo inserimento
  ClearCampi();
  edNome.SetFocus;
end;

procedure TPianiManutenzioni.btsalvaClick(Sender: TObject);
begin
   //controllo che i parametri obbligatori siano inseriti sia
  //per la modifica che per l'inserimento
  if cbtipomanutenzione.ItemIndex=-1 then
  begin
     ShowMessage('Devi indicare il tipo del piano manutenzione (Es: Manutenzione).');
     cbtipomanutenzione.SetFocus;
     exit();
  end;
  if ednome.Text='' then
  begin
     ShowMessage('Devi indicare il nome del piano manutenzione (Es: PIANO TRIMESTRALE).');
     edNome.SetFocus;
     exit();
  end;
  if edintervallo.Text='' then
  begin
     ShowMessage('Devi indicare l''intervallo di tempo.');
     edintervallo.SetFocus;
     exit();
  end;
  if eddatainizio.Text='' then
  begin
     ShowMessage('Devi indicare la data inizio del piano manutenzione.');
     eddatainizio.SetFocus;
     exit();
  end;
  if eddatafine.Text='' then
  begin
     ShowMessage('Devi indicare la data fine del piano manutenzione.');
     eddatafine.SetFocus;
     exit();
  end;
   if cbtemplate.ItemIndex=-1 then
  begin
     ShowMessage('Devi scegliere un template di piano manutenzione.');
     cbtemplate.SetFocus;
     exit();
  end;
  //Controlla che data fine > data inizio)
  if StrToDate(eddatafine.Text)<StrToDate(eddatainizio.Text) then
  begin
     ShowMessage('Attenzione, la data fine del piano manutenzione è antecedente la data di inizio.');
     eddatainizio.SetFocus;
     exit();
  end;
  // salva tutte le modifiche fatte sui campi nella tabella
  if cbpiani_manutenzioni.Text<>'' then
  begin
  ////////////////////////////////////////////////////////////////////
  ///              MODIFICA SOGGETTO
  ////////////////////////////////////////////////////////////////////
      with zq_piani_manutenzioni do
      begin
           Close;
           sql.Clear;
           sql.Add('UPDATE PIANI_MANUTENZIONI SET '+
                          'IDDITTA=:IDDITTA,'+
                          'IDTEMPLATE=:IDTEMPLATE,'+
                          'TIPOPIANO=:TIPO,' +
                          'NOME=:NOME,'+
                          'INTERVALLO=:INTERVALLO,'+
                          'UM_INTERVALLO=:UMINTERVALLO,'+
                          'DATA_INIZIO=:DATAINIZIO,'+
                          'DATA_FINE=:DATAFINE,'+
                          'NOTE=:NOTE '+
                          'WHERE IDPIANO=:ID');
           ParamByName('ID').AsInteger:=integer(cbpiani_manutenzioni.Items.Objects[cbpiani_manutenzioni.ItemIndex]);
           ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
           ParamByName('IDTEMPLATE').AsInteger:=integer(cbtemplate.Items.Objects[cbtemplate.ItemIndex]);
           ParamByName('TIPO').Asstring:=cbtipomanutenzione.Text;
           ParamByName('NOME').AsString:=edNome.Text;
           ParamByName('INTERVALLO').AsInteger:=StrToInt(edintervallo.Text);
           ParamByName('UMINTERVALLO').AsInteger:=cbUMIntervallo.ItemIndex;
           ParamByName('DATAINIZIO').AsDate:=StrToDate(eddatainizio.Text);
           ParamByName('DATAFINE').AsDate:=StrToDate(eddatafine.Text);
           ParamByName('NOTE').AsString:=mmnote.Text;
           ExecSQL;
           //riaggiorna la lista dei soggetti nelle combo
           LoadComboPianiManutenzioni();
           //comunica l'esito positivo della modifica
           ShowMessage(edNome.Text+' è stato modificato correttamente.');
      end;
  end
  else
  begin
            ////////////////////////////////////////////////////////////////////
            ///              INSERIMENTO SOGGETTO
            ////////////////////////////////////////////////////////////////////
            //inserisci il nuovo soggetto nel DB
            with zq_piani_manutenzioni do
            begin
                 Close;
                 sql.Clear;
                 sql.Add('INSERT INTO PIANI_MANUTENZIONI ('+
                     'IDDITTA,'+
                     'IDTEMPLATE,'+
                     'TIPOPIANO,' +
                     'NOME,'+
                     'INTERVALLO,'+
                     'UM_INTERVALLO,'+
                     'DATA_INIZIO,'+
                     'DATA_FINE,'+
                     'NOTE'+
                     ') VALUES (:IDDITTA,:IDTEMPLATE,:TIPO,:NOME,:INTERVALLO,:UMINTERVALLO,:DATAINIZIO,:DATAFINE,:NOTE)');
                 ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
                 ParamByName('IDTEMPLATE').AsInteger:=integer(cbtemplate.Items.Objects[cbtemplate.ItemIndex]);
                 ParamByName('TIPO').Asstring:=cbtipomanutenzione.Text;
                 ParamByName('NOME').AsString:=ednome.Text;
                 ParamByName('INTERVALLO').AsInteger:=StrToInt(edintervallo.Text);
                 ParamByName('UMINTERVALLO').AsInteger:=cbUMIntervallo.ItemIndex;
                 ParamByName('DATAINIZIO').AsDate:=StrToDate(eddatainizio.Text);
                 ParamByName('DATAFINE').AsDate:=StrToDate(eddatafine.Text);
                 ParamByName('NOTE').AsString:=mmNote.Text;
                 ExecSQL;
                 //riaggiorna la lista dei soggetti nelle combo
                 LoadComboPianiManutenzioni();
                 //comunica l'esito positivo dell'inserimento
                 ShowMessage(edNome.Text+ ' è stato inserito correttamente.');
            end;
       end;
  btnuovoClick(self);
end;

procedure TPianiManutenzioni.cbpiani_manutenzioniChange(Sender: TObject);
begin
   if cbpiani_manutenzioni.ItemIndex<>-1 then
     begin
     //mostro nei campi il soggetto selezionato
          with zq_piani_manutenzioni do
          begin
               Close;
               sql.Clear;
               sql.Add('SELECT * FROM PIANI_MANUTENZIONI WHERE IDPIANO=:ID');
               ParamByName('ID').AsInteger:=integer(cbpiani_manutenzioni.Items.Objects[cbpiani_manutenzioni.ItemIndex]);
               ExecSQL;
               Open;
               edNome.Text:=FieldByName('NOME').AsString;
               cbtipomanutenzione.ItemIndex:=cbtipomanutenzione.Items.IndexOf(fieldbyname('TIPOPIANO').asstring);
               cbtemplate.ItemIndex:=cbtemplate.Items.IndexOfObject(TObject(fieldbyname('IDTEMPLATE').AsInteger));
               edintervallo.Text:=FieldByName('INTERVALLO').AsString;
               cbUMIntervallo.ItemIndex:=FieldByName('UM_INTERVALLO').AsInteger;
               eddatainizio.Text:=FieldByName('DATA_INIZIO').AsString;
               eddatafine.Text:=FieldByName('DATA_FINE').AsString;
               mmNote.Text:=FieldByName('NOTE').AsString;
          end;
     end;
end;

procedure TPianiManutenzioni.cbpiani_manutenzioniExit(Sender: TObject);
begin
  (sender as TComboBox).ItemIndex := (sender as TComboBox).Items.IndexOfObject(TObject((sender as TComboBox).Items.Objects[(sender as TComboBox).ItemIndex]));
  (sender as TComboBox).OnChange(self);
end;

procedure TPianiManutenzioni.cbpiani_manutenzioniKeyPress(Sender: TObject;
  var Key: char);
begin
  if key=#13 then
    SelectNext(sender as twincontrol,true,true);
end;

procedure TPianiManutenzioni.edNomeChange(Sender: TObject);
begin
     btsalva.Enabled:=true;
end;

procedure TPianiManutenzioni.bteliminaClick(Sender: TObject);
var
  buttonSelected : Integer;
begin

   //controllo che sia stato selezionato un soggetto sennò avverto
   //che è necessario selezionarne uno
   if cbpiani_manutenzioni.ItemIndex<>-1 then
   begin
      //chiede conferma e poi cancella il record
      buttonSelected := MessageDlg('Si sta per eliminare '+edNome.Text+' dal database. Continuare?',mtInformation, mbOKCancel, 0);
      if buttonSelected = mrOK     then
      begin
           with zq_piani_manutenzioni do
           begin
                Close;
                sql.Clear;
                sql.Add('DELETE FROM PIANI_MANUTENZIONI WHERE IDPIANO=:ID');
                ParamByName('ID').AsInteger:=integer(cbpiani_manutenzioni.Items.Objects[cbpiani_manutenzioni.ItemIndex]);
                ExecSQL;
           end;
           //rilegge tutti i soggetti e li carica nelle combo
           LoadComboPianiManutenzioni();
           //pulisce tutti i campi
           ClearCampi();
      end
   end
   else ShowMessage('Per eliminare un piano manutenzione è necessario prima selezionarne uno dalla lista.');
end;

procedure TPianiManutenzioni.ClearCampi();
begin
  cbpiani_manutenzioni.ClearSelection;
  cbtipomanutenzione.ClearSelection;
  cbtemplate.ClearSelection;
  edNome.Clear;
  edintervallo.Clear;
  cbUMIntervallo.ItemIndex:=0;
  eddatainizio.Clear;
  eddatafine.Clear;
  mmNote.Clear;
  btsalva.Enabled:=false;
end;

procedure TPianiManutenzioni.LoadComboTemplate();
begin
     cbTemplate.Clear;
     cbtemplate.Items.Add('');
     with zq_piani_manutenzioni do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDTEMPLATE, IDDITTA, NOME_TEMPLATE FROM INTERVENTI_TEMPL');
             sql.add('WHERE IDDITTA=:IDDITTA');
             ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
             ExecSQL;
             Open;
             while not EOF do
             begin
                  //carico il campo NOME di ogni singolo record nella combo di visualizzazione
                  cbTemplate.Items.AddObject(FieldByName('NOME_TEMPLATE').AsString,TObject(FieldByName('IDTEMPLATE').AsInteger));
                  Next;
             end;
             Close;
        end
end;

procedure TPianiManutenzioni.LoadComboPianiManutenzioni();
begin
//svuota combo
cbpiani_manutenzioni.Clear;
with zq_piani_manutenzioni do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDPIANO, NOME FROM PIANI_MANUTENZIONI');
             sql.add('WHERE IDDITTA=:IDDITTA');
             ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbpiani_manutenzioni.Items.AddObject(FieldByName('NOME').AsString,TObject(FieldByName('IDPIANO').AsInteger));
                  Next;
             end;
        end
end;
initialization
  {$I pianimanutenzioni_frm.lrs}

end.

